This function computes X index-of Y (viz. X⍳Y) where X and Y are compatible inverted tables. R is the indices of Y in X.
An inverted table is a (nested) vector all of whose items have the same number of major cells. That is, 1=⍴⍴⍵ and (≢⊃⍵)=≢¨⍵. An inverted table representation of relational data is more efficient in time and space than other representations.
The following is an example of an inverted table:
X←(10 3⍴⎕a) (⍳10) 'metalepsis'
X
┌───┬───────────────────┬──────────┐
│ABC│0 1 2 3 4 5 6 7 8 9│metalepsis│
│DEF│ │ │
│GHI│ │ │
│JKL│ │ │
│MNO│ │ │
│PQR│ │ │
│STU│ │ │
│VWX│ │ │
│YZA│ │ │
│BCD│ │ │
└───┴───────────────────┴──────────┘
Using inverted tables, it is often necessary to perform a table look-up to find the "row" indices of one in another. Suppose there is a second table Y:
Y←(⊂⊂3 1 4 1 5 9)⌷¨X
Y
GHI 3 1 4 1 5 9 tmamli
ABC
JKL
ABC
MNO
YZA
To compute the indices of Y in X using dyadic ⍳, it is necessary to first un-invert each of the tables in order to create nested matrices that ⍳ can handle.
unvert ← {⍉↑⊂⍤¯1¨⍵}
unvert X
┌───┬─┬─┐
│ABC│0│m│
├───┼─┼─┤
│DEF│1│e│
├───┼─┼─┤
│GHI│2│t│
├───┼─┼─┤
│JKL│3│a│
├───┼─┼─┤
│MNO│4│l│
├───┼─┼─┤
│PQR│5│e│
├───┼─┼─┤
│STU│6│p│
├───┼─┼─┤
│VWX│7│s│
├───┼─┼─┤
│YZA│8│i│
├───┼─┼─┤
│BCD│9│s│
└───┴─┴─┘
(unvert X) ⍳ (unvert Y)
3 1 4 1 5 9
Each un-inverted table requires considerably more workspace than its inverted form, so if the inverted tables are large, this operation is potentially expensive in terms of both time and workspace.
8⌶ is an optimised version of the above expression.
X (8⌶) Y 3 1 4 1 5 9